Maze generation

迷宮生成演算法是一種用於創建迷宮的演算法,其目標是生成一個具有一定難度和趣味性的迷宮。常見的迷宮生成演算法包括深度優先搜索演算法、隨機追踪演算法、分割演算法和Eller's演算法等。

深度優先搜索演算法是一種簡單而有效的迷宮生成演算法。它從一個起始位置開始,在迷宮中隨機選擇一個未訪問的相鄰位置,並將其標記為通過,然後遞歸地探索該位置,直到無法繼續前進為止。然後,回溯回到之前的位置,並選擇另一個未訪問的相鄰位置,重複上述過程,直到所有的位置都被訪問。

以下我們但簡介深度優先搜索法,又叫backtracking。

backtracking 1

1. 準備好格

image-20230525101628092

跟以往一樣,我們首先準備好格的class。今次比較特別的是,我們會準備n+1格,20x20的話就會是21x21格,因為要為迷宮準備好四面牆。

2. 加入cell class

image-20230525104430225

新增一個cell class,這個class為迷宮的單元格。每個單元格包含4個spot,表示單元和的四個角落,其中右下角的Spot被標記為牆。

此外,每個單元格還包含了一個neighbors列表,表示與該單元格相鄰的單元格。在program2中,程式會將每個Spot添加到相應的單元格中,並且將每個單元格的相鄰單元格添加到neighbors列表中。這種方法可以減少程式生成迷宮時的計算量,提高程式的性能。

 

接著返回主程式,在setup()中,新增cols/2row/2個cell(因為每4個spot為一個cell,所以只要一半就可以了),接著跟之前一樣幫這此cell加係鄰居。

3. 加入左邊界和右邊界

image-20230525105124112

加入一個wallSpot=[],將左邊界和上邊界都填滿,這是迷宮的四面牆。

 

此外,在cell class中,在加係spot的同時,除了右下角的Spot被標記為牆以外,右上角和左下角的Spot也被標記為牆。因backtracking演算法是將走過的地方的牆拆除,而不是建牆的。

4. Backtracking

backtracking 1

在程式的最開始,加入current作為backtracking演算法的現存位置,另外加入stack作為演算法的堆疊,用以紀錄演算法到過的地方。

 

setup()的最低下加入current的位置,當然你也可以將current的初始位置隨機擺放。

 

draw()的最底下,加入highlight(),highligt current這一格方便觀察。

之後便是核心的backtracking演算法,

  1. 找出current所有未訪問的鄰居

  2. 如果有未訪問的鄰居:

    1. 隨機挑選一個

    2. current放入stack推疊

    3. currentnext中間的牆拆去

    4. next標示為已訪問

    5. next變成current開始新一輪的操作

  3. 如果沒有未訪問的鄰居,即到達掘頭路

    1. 就將stack推疊逐個釋放出來,直到上一個有鄰居(分岔路)的格。

 

setup()draw()外加入removeWall()函數。由於所有牆都是cell的右方和下方,所以要分清楚這個兩cell哪一個在左右、哪一個在上下。

考考你

為程式加入上一章的AStar找尋路徑的演算法,做到跟我下面的程式一樣,先生成地圖再找路徑